package main

import "fmt"

// map中 value的嵌套
func M1() {
	// 在value中嵌套一个数组
	var map1 = map[string][]int{}
	map1["name"] = []int{1, 2, 3}
	fmt.Println(map1)

	// 在value中嵌套map, 需要用make初始化
	var map2 = make(map[string]map[string]int)
	map2["wangyi"] = map[string]int{"zy": 1, "hh": 3}
	fmt.Println(map2)

	// 在value中嵌套数组，在数组里面定义一个map, 需要make初始化
	var map3 = make(map[string][2]map[int]string)
	map3["wangyi"] = [2]map[int]string{map[int]string{1: "zy", 2: "hh"}, {1: "myc", 2: "ytc"}}
	fmt.Println(map3)
}

// map中 key的嵌套
func M2() {
	// 将key定义成一个数组
	var map1 = make(map[[2]int]int)
	map1[[2]int{1, 2}] = 5
	fmt.Println(map1)

	// 因为map和切片不可hash，所以不能做为一个key保存在map中
	// map1 := make(map[[]int]int)
	// map1 := make(map[map[int]string]int)

	// 但是可以在数组中定义切片或者map， 所以不可以在key中定义数组， 在key的数组中定义map和切片
	// var map2 = make(map[[2]map[int]string]int)
	fmt.Println("k1--------------------------------")
}

// map的变量赋值

func M3() {
	var map1 = make(map[int]string)
	map1[1] = "myc"
	map1[2] = "djr"
	map1[3] = "myc too"

	var map2 = map1
	fmt.Println(map1)
	fmt.Printf("%p\n", &map1)
	fmt.Println(map2)
	fmt.Printf("%p\n", &map2)

	// 被赋值的map跟原map指向的是同一个内存地址
	// 当map2的值被改变时，map1的值也随之改变
	map2[2] = "myc oooooooooooooo-o"
	fmt.Println(map1)
	fmt.Printf("%p\n", &map1)
	fmt.Println(map2)
	fmt.Printf("%p\n", &map2)

}
